package com.bruce.framework.json;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.ParserConfig;

import java.lang.reflect.Type;
import java.util.Objects;
import java.util.Optional;

/**
 * json工具类
 * <br>CreateDate  2021/09/09 12:01:50
 *
 * @author luotuan
 * @version 1.0.0
 */
public class BaseJsonUtil {
    private static final String DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
    private static final String STRING_CLASSNAME = "java.lang.String";

    public static String toJson(Object source){
        return toJson(source,null);
    }

    /**
     * 对象转为Json数据
     *
     * @param source 对象
     * @param datePattern 时间格式
     * @return Json字符串
     * <br>CreateDate 2021/09/09 11:49:19
     * @author luotuan
     * @since 1.0.0
     **/
    public static String toJson(Object source,String datePattern){
        if(source == null){
            return "{}";
        }
        return JSON.toJSONStringWithDateFormat(source, Optional.ofNullable(datePattern).orElse(DATE_PATTERN));
    }

    /**
     * 将json字符串转为指定类型对象
     *
     * @param jsonString json字符串
     * @param typeOfT    类型
     * @return 指定对象
     * <br>CreateDate 2021/09/09 11:53:04
     * @author luotuan
     * @since 1.0.0
     **/
    public static <T> T convert(String jsonString, Type typeOfT) {
        return JSON.parseObject(jsonString, typeOfT);
    }


    /**
     * json转对象
     *
     * @param jsonString  json字符串
     * @param typeOf      类型的
     * @param datePattern 日期模式
     * @return 转换后的对象
     * <br>CreateDate 2021/09/09 12:00:31
     * @author luotuan
     * @since 1.0.0
     **/
    public static <T> T convert(String jsonString, Type typeOf,String datePattern) {
        if("".equals(jsonString) || Objects.isNull(jsonString)){
            return null;
        }
        if(STRING_CLASSNAME.equals(typeOf.getTypeName())){
            return (T)jsonString;
        }
        try( DefaultJSONParser parser = new DefaultJSONParser(jsonString, ParserConfig.getGlobalInstance())){
            parser.setDateFormat(Optional.ofNullable(datePattern).orElse(DATE_PATTERN));
            return parser.parseObject(typeOf);
        }
    }
}
